| Anterior | Próximo | Índice |
SP Valor inicial do Ponteiro de Pilha SP - 02 Valor de SP após empilhar o último parâmetro (o terceiro) SP - 04 Valor de SP após empilhar o penúltimo parâmetro (o segundo) SP - 06 Valor de SP após empilhar o primeiro parâmetro SP - 08 Valor de SP após empilhar o valor de CS SP - 10 Valor de SP após empilhar o valor de IP SP - 12 Valor de SP após empilhar o valor de BP dentro da rotinaConsiderando o valor final de SP acima (SP Inicial menos 12), os endereços dos parâmetros dentro da pilha podem ser acessados usando este método (após um MOV BP, SP):
1° parâmetro = [BP+06] = [(SP - 12) + 06] = [SP - 6] 2° parâmetro = [BP+08] = [(SP - 12) + 08] = [SP - 4] 3° parâmetro = [BP+10] = [(SP -12) + 10] = [SP - 2]Os números não mentem: os endereços obtidos acima correspondem exatamente aos deslocamentos dos argumentos no segmento de pilha, como você pode constatar comparando com a configuração anterior. Veja abaixo um exemplo de uma rotina em NASM e um programa usando Turbo. A rotina recebe como parâmetro um único argumento (um ponteiro para um string de caracteres), e exibe o string usando a interrupção 0x21 do DOS, serviço 0x02, que imprime um único caracter passado usando o registrador DL. Note que ele é o primeiro e único parâmetro:
GLOBAL _prints
segment printsf_TEXT public class=CODE align=1
_prints:
push bp
mov bp,sp
push si
push ds
mov ah,2
lds si,[bp+6]
cld
.1:
lodsb
cmp al,0
je .fim
mov dl,al
int 0x21
jmp short .1
.fim:
pop ds
pop si
pop bp
retf
/* programa FAR.C */
/* chamada de rotina distante para modelo largo de memoria */
/* ------------------------------------
Use:
nasm -fobj printsf.asm
para produzir printsf.obj e depois use
tcc -ml far.c printsf.obj
para produzir far.exe. A opcao -ml significa
model large (modelo grande de memoria)
---------------------------------------- */
extern void prints(char *);
int main()
{
prints("Testando o modelo grande de memoria com NASM e Turbo C...");
return(0);
}
/* você também pode chamar uma rotina distante em modelo pequeno */
/* nesse caso, use far no tipo de retorno e nos argumentos do tipo matriz */
/* Exemplo de chamada de rotina distante para modelo SMALL de memoria */
/* ------------------------------------
Use:
nasm -fobj printsf.asm
para produzir printsf.obj e depois use
tcc far.c printsf.obj
---------------------------------------- */
extern void far prints(char far *);
int main()
{
prints("Testando rotina distante com modelo SMALL de memória...");
return(0);
}
|
| Anterior | Próximo | Índice |